package com.lei.array;

/**
 * @author: leiGer
 * @Date: 2021/07/13
 * @Time: 23:22
 */

/**
 * 给定一个整型矩阵 matrix，请按照转圈的方式打印它。
 * 例如：
 * 1 2 3 4
 * 5 6 7 8
 * 9 10 11 12
 * 13 14 15 16
 * 打印结果为：1，2，3，4，8，12，16，15，14，13，9，5，6，7，11，10
 *
 *
 *  * 这类问题需要将思维打开，从宏观的层面去找出问题存在的共性从而求解。
 *  * 如果你的思维局限在1是如何变到2的、4是怎么变到8的、11之后为什么时10、它们之间有什么关联，那么你就陷入死胡同了。
 *  * 从宏观的层面找共性，其实转圈打印的过程就是不断顺时针打印外围元素的过程，
 *  * 只要给你一个左上角的点（如(0,0)）和右下角的点（如(3,3)），你就能够打印出1 2 3 4 8 12 16 15 14 13 9 5；
 *  * 同样，给你(1,1)和(2,2)，你就能打印出6 7 11 10。这个根据两点打印正方形上元素的过程可以抽取出来，
 *  * 整个问题也就迎刃而解了
 *
 */
public class AroundPrintmMatrix {
    public void spiralOrderPrint(int[][]matrix){
        int lR = 0;
        int lC = 0;
        int rR = matrix.length - 1;
        int rC = matrix[0].length - 1;
        while (lR <= rR && lC <= rC){
            printEdge(matrix,lR++,lC++,rR--,rC--);
        }

    }
    private void printEdge(int[][] arr, int lR, int lC, int rR, int rC) {
        //如果只有一行
        if(lR == rR){
            for (int i = lC; i <= rC; i++) {
                System.out.println(arr[lR][i]+" ");
            }
        }else if (lC == rC){//只有一列
            for (int i = lR; i <= rR; i++) {

                System.out.println(arr[i][lC]+" ");
            }
        }else{
            int curC = lC;
            int curR = lR;
            while (curC != rC){
                System.out.print(arr[lR][curC]+" ");
                curC++;
            }
            while (curR != rR){
                System.out.print(arr[curR][rC]+" ");
                curR++;
            }
            while (curC != lC){
                System.out.print(arr[rR][curC]+" ");
                curC--;
            }
            while (curR != lR){
                System.out.print(arr[curR][lC]+" ");
                curR--;
            }
        }

    }
    //打印原矩阵
    private static void printMatrix(int[][] matrix) {
        for(int i = 0;i<4;++i){
            for(int j = 0;j<4;++j){
                System.out.print(matrix[i][j]+"     ");
            }
            System.out.println();
        }
    }

    public static void main(String[] args) {
        int [][]arr = new int[][]{{1,2,3,4},{5,6,7,8,},{9,10,11,12},{13,14,15,16}};
        AroundPrintmMatrix around = new AroundPrintmMatrix();
        printMatrix(arr);
        System.out.println("-----------------------------------");
        around.spiralOrderPrint(arr);

    }
}
